[XEN] The shadow FAST_FAULT_PATH optimisation assumes that pages never
authorssmith@localhost.localdomain <ssmith@localhost.localdomain>
Mon, 11 Dec 2006 19:16:29 +0000 (11:16 -0800)
committerssmith@localhost.localdomain <ssmith@localhost.localdomain>
Mon, 11 Dec 2006 19:16:29 +0000 (11:16 -0800)
transition between mmio and RAM-backed.  This isn't true after a
an add_to_physmap memory op.  Fix this by just blowing the shadow tables
after every such operation; they're rare enough that the performance
hit is not a concern.

Signed-off-by: Steven Smith <sos22@cam.ac.uk>
Acked-by: Tim Deegan <Tim.Deegan@xensource.com>
xen/arch/x86/mm.c
xen/arch/x86/mm/shadow/common.c
xen/include/asm-x86/shadow.h

index 48dea7cffb293eb875c1dd80b9ecd38f523ca7e7..4c26fc99692df48e9e7e6880df30c01c355299e6 100644 (file)
@@ -2968,7 +2968,17 @@ long arch_memory_op(int op, XEN_GUEST_HANDLE(void) arg)
         guest_physmap_add_page(d, xatp.gpfn, mfn);
 
         UNLOCK_BIGLOCK(d);
-        
+
+        /* If we're doing FAST_FAULT_PATH, then shadow mode may have
+           cached the fact that this is an mmio region in the shadow
+           page tables.  Blow the tables away to remove the cache.
+           This is pretty heavy handed, but this is a rare operation
+           (it might happen a dozen times during boot and then never
+           again), so it doesn't matter too much. */
+        shadow_lock(d);
+        shadow_blow_tables(d);
+        shadow_unlock(d);
+
         put_domain(d);
 
         break;
index 1f295758d843917c240c4901580898d933a4d1e2..b4be85ee7e13c8dffebea9e43963a289b0c63014 100644 (file)
@@ -733,7 +733,7 @@ void shadow_prealloc(struct domain *d, unsigned int order)
 
 /* Deliberately free all the memory we can: this will tear down all of
  * this domain's shadows */
-static void shadow_blow_tables(struct domain *d) 
+void shadow_blow_tables(struct domain *d) 
 {
     struct list_head *l, *t;
     struct shadow_page_info *sp;
index 78998edea9c0c1544afe60b72df770430ac23d2c..f923f662de31c3cb024ab5a34f46c8e4a470f515 100644 (file)
@@ -540,6 +540,9 @@ extern int shadow_remove_write_access(struct vcpu *v, mfn_t readonly_mfn,
  * Returns non-zero if we need to flush TLBs. */
 extern int shadow_remove_all_mappings(struct vcpu *v, mfn_t target_mfn);
 
+/* Remove all mappings from the shadows. */
+extern void shadow_blow_tables(struct domain *d);
+
 void
 shadow_remove_all_shadows_and_parents(struct vcpu *v, mfn_t gmfn);
 /* This is a HVM page that we thing is no longer a pagetable.